Object Selection এর জন্য OpenGL Picking ব্যবহার করা

Picking এবং Object Selection - জোগল (JOGL) - Java Technologies

346

JOGL (Java OpenGL) Java এ 3D গ্রাফিক্স রেন্ডার করার জন্য ব্যবহৃত একটি লাইব্রেরি। Picking হল একটি OpenGL টেকনিক যা ব্যবহারকারীর মাউস ক্লিক বা অন্য কোন ইন্টারঅ্যাকশন থেকে গ্রাফিক্স অবজেক্ট নির্বাচন করতে ব্যবহৃত হয়। Picking সাধারণত 3D গ্রাফিক্স অ্যাপ্লিকেশনগুলিতে ব্যবহৃত হয় যেখানে ব্যবহারকারী কোন অবজেক্ট নির্বাচন করতে পারে, যেমন গেমস, 3D মডেলিং সফটওয়্যার, বা অন্যান্য ইন্টারেক্টিভ অ্যাপ্লিকেশন।

Picking সাধারনত ray casting এর মাধ্যমে সম্পন্ন করা হয়, যেখানে মাউস ক্লিকের অবস্থান থেকে একটি রে (ray) পৃথিবী বা গ্রাফিক্স সাপেক্ষে পরীক্ষা করা হয় এবং তার সাথে সংঘর্ষের মাধ্যমে নির্বাচিত অবজেক্টটি নির্ধারণ করা হয়।

OpenGL Picking কী?

OpenGL Picking হল এমন একটি পদ্ধতি যেখানে আপনি গ্রাফিক্স ইন্টারফেসের মধ্যে একটি অবজেক্ট নির্বাচন করতে পারেন, এটি সাধারণত মাউস ক্লিক বা টাচ ইন্টারঅ্যাকশনের মাধ্যমে ঘটে। এই পদ্ধতি নির্বাচনযোগ্য গ্রাফিক্স অবজেক্টের সাথে ray সংঘর্ষ পরীক্ষা করে তা নির্ধারণ করে।

Picking দুটি প্রধানভাবে বাস্তবায়িত হয়:

  1. Color Picking: এখানে, অবজেক্টগুলির উপর একটি নির্দিষ্ট রঙ সেট করা হয় এবং মাউস ক্লিকের মাধ্যমে সেই রঙের ভিত্তিতে অবজেক্ট নির্বাচিত হয়।
  2. Ray Casting Picking: এখানে, একটি রে (যা মাউস ক্লিক থেকে উদ্ভূত) 3D পৃথিবীর সাথে সংঘর্ষের মাধ্যমে নির্বাচিত অবজেক্ট শনাক্ত করা হয়।

JOGL এ Object Selection (Picking) বাস্তবায়ন

JOGL ব্যবহার করে Picking করতে সাধারণত Color Picking বা Ray Picking পদ্ধতি ব্যবহার করা হয়। নিচে Color Picking এর মাধ্যমে Object Selection কিভাবে করা যায় তা দেখানো হলো।

Color Picking উদাহরণ:

  1. প্রতিটি অবজেক্টের জন্য একটি ইউনিক রঙ (RGB) নির্ধারণ করুন।
  2. মাউস ক্লিকের পজিশন থেকে রঙ পরীক্ষা করুন এবং যেই অবজেক্টের রঙ মেলে সেটি নির্বাচন করুন।

JOGL Color Picking উদাহরণ:

import com.jogamp.opengl.*;
import com.jogamp.opengl.awt.GLCanvas;
import javax.swing.*;

public class PickingExample implements GLEventListener {

    private int selectedObject = -1;  // No object selected by default

    @Override
    public void init(GLAutoDrawable drawable) {
        GL2 gl = drawable.getGL().getGL2();
        gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);  // Set background to black
    }

    @Override
    public void display(GLAutoDrawable drawable) {
        GL2 gl = drawable.getGL().getGL2();
        gl.glClear(GL2.GL_COLOR_BUFFER_BIT);  // Clear the screen

        // Draw objects with unique colors for picking
        drawObject(gl, 0.0f, 0.5f, 1.0f);  // Red object
        drawObject(gl, -0.5f, -0.5f, 0.0f);  // Green object
        drawObject(gl, 0.5f, -0.5f, 0.0f);  // Blue object
    }

    @Override
    public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) {
        GL2 gl = drawable.getGL().getGL2();
        gl.glViewport(0, 0, width, height);  // Adjust the viewport size
    }

    @Override
    public void displayChanged(GLAutoDrawable drawable, boolean modeChanged, boolean deviceChanged) {}

    // Method to draw an object with a unique color (for picking)
    private void drawObject(GL2 gl, float x, float y, float z) {
        // Use unique colors for picking
        if (x == 0.0f && y == 0.5f) {
            gl.glColor3f(1.0f, 0.0f, 0.0f);  // Red
        } else if (x == -0.5f && y == -0.5f) {
            gl.glColor3f(0.0f, 1.0f, 0.0f);  // Green
        } else if (x == 0.5f && y == -0.5f) {
            gl.glColor3f(0.0f, 0.0f, 1.0f);  // Blue
        }

        gl.glPushMatrix();
        gl.glTranslatef(x, y, z);  // Translate the object position
        gl.glBegin(GL2.GL_QUADS);
        gl.glVertex2f(-0.1f, 0.1f);  // Top-left corner
        gl.glVertex2f(0.1f, 0.1f);   // Top-right corner
        gl.glVertex2f(0.1f, -0.1f);  // Bottom-right corner
        gl.glVertex2f(-0.1f, -0.1f); // Bottom-left corner
        gl.glEnd();
        gl.glPopMatrix();
    }

    // Mouse click callback to handle picking
    public void handlePicking(int x, int y, GL2 gl) {
        GLU glu = new GLU();
        int[] viewport = new int[4];
        gl.glGetIntegerv(GL.GL_VIEWPORT, viewport, 0);  // Get viewport size
        float[] modelview = new float[16];
        float[] projection = new float[16];

        gl.glGetFloatv(GL2.GL_MODELVIEW_MATRIX, modelview, 0);  // Get modelview matrix
        gl.glGetFloatv(GL2.GL_PROJECTION_MATRIX, projection, 0);  // Get projection matrix

        IntBuffer selectBuffer = IntBuffer.allocate(64);  // Selection buffer
        gl.glSelectBuffer(64, selectBuffer);
        gl.glRenderMode(GL2.GL_SELECT);  // Set OpenGL to selection mode

        gl.glInitNames();  // Initialize name stack
        gl.glPushName(-1);  // Push a placeholder name

        gl.glMatrixMode(GL2.GL_PROJECTION);
        gl.glPushMatrix();  // Save projection matrix
        gl.glLoadIdentity();
        glu.gluPickMatrix(x, viewport[3] - y, 5, 5, viewport, 0);  // Set the picking region
        gl.glMultMatrixf(projection, 0);  // Apply the projection matrix

        gl.glMatrixMode(GL2.GL_MODELVIEW);  // Switch back to modelview matrix
        display(drawable);  // Redraw the objects for picking

        gl.glMatrixMode(GL2.GL_PROJECTION);  // Restore projection matrix
        gl.glPopMatrix();
        gl.glMatrixMode(GL2.GL_MODELVIEW);  // Restore modelview matrix

        gl.glRenderMode(GL2.GL_RENDER);  // Switch back to render mode

        // Process selection buffer to detect the object picked
        IntBuffer result = selectBuffer.position(0);
        if (result.remaining() > 0) {
            int hits = result.get();
            if (hits > 0) {
                int name = result.get(3);  // Get the object name
                selectedObject = name;
                System.out.println("Selected Object: " + selectedObject);
            }
        }
    }

    public static void main(String[] args) {
        GLCanvas canvas = new GLCanvas();
        PickingExample pickingExample = new PickingExample();
        canvas.addGLEventListener(pickingExample);
        canvas.setSize(800, 600);

        JFrame frame = new JFrame("JOGL Picking Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(canvas);
        frame.setSize(800, 600);
        frame.setVisible(true);

        // Add mouse listener for picking
        canvas.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent e) {
                pickingExample.handlePicking(e.getX(), e.getY(), canvas.getGL().getGL2());
            }
        });
    }
}

ব্যাখ্যা:

  1. Drawing Objects: drawObject() ফাংশনটি গ্রাফিক্স অবজেক্ট আঁকার জন্য ব্যবহৃত হয় এবং প্রতিটি অবজেক্টের জন্য একটি ইউনিক রঙ (RGB) সেট করা হয়। এটি color picking এর জন্য গুরুত্বপূর্ণ।
  2. Picking Logic:
    • Picking করতে, glSelectBuffer() ফাংশন ব্যবহার করে একটি বাফার তৈরি করা হয়, যা OpenGL-কে selection mode এ পরিবর্তন করে।
    • মাউস ক্লিকের পজিশন থেকে gluPickMatrix() এর মাধ্যমে picking region নির্ধারণ করা হয়।
    • অবজেক্টগুলির উপর ক্লিক করার মাধ্যমে, রেন্ডারিংয়ের আউটপুট থেকে কোন অবজেক্ট নির্বাচন করা হচ্ছে তা জানা যায়।
  3. Mouse Interaction: mousePressed() ফাংশনটি মাউস ক্লিকের ইভেন্ট হ্যান্ডেল করে এবং পিকিং সিস্টেমকে সক্রিয় করে।

Color Picking-এ সমস্যা এবং উন্নতি

  • Color Picking পদ্ধতিতে যেহেতু প্রতিটি অবজেক্টের একটি ইউনিক রঙ ব্যবহার করা হয়, তাই রঙের এক্স্যাক্ট ম্যাচ খুঁজে বের করা প্রয়োজন। তবে, মাউস ক্লিকের পজিশন থেকে রঙ পড়ার জন্য selection buffer ব্যবহার করতে হয় যা আরও নির্ভুল এবং কার্যকরী।

সারাংশ


OpenGL Picking JOGL ব্যবহার করে Object Selection এর জন্য একটি শক্তিশালী কৌশল। মাউস ক্লিকের মাধ্যমে নির্বাচিত অবজেক্ট খুঁজে বের করতে color picking এবং ray picking দুটি পদ্ধতি ব্যবহার করা হয়। JOGL এর মাধ্যমে আপনি সহজেই রেন্ডার করা অবজেক্টগুলো নির্বাচন করতে পারেন এবং এতে interactive graphics তৈরি করতে পারেন যা গেমস এবং 3D মডেলিং অ্যাপ্লিকেশনে ব্যবহৃত হয়।

Content added By
Promotion

Are you sure to start over?

Loading...